package com.sdx.console.utils;

import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class EDateUtil {


	private static String Y = "yyyy";
	private static String YM = "yyyy-MM";
	private static String YMD = "yyyy-MM-dd";
	private static String YMDHMS = "yyyy-MM-dd HH:mm:ss";
	private static String yyyyMMddHHmmss="yyyyMMddHHmmss";
	private static String INTYMD="yyyyMMdd";
	private static String M="M";

	/**
	 *
	 * @param date
	 * @return 返回20190524样的数字
	 */
	public static int getDateInt(Date date) {
		SimpleDateFormat sdf = new SimpleDateFormat(INTYMD);
		String dateStr = sdf.format(date);
		return Integer.parseInt(dateStr);
	}

	/**用户保存用户操作数据，用户只能查询最新一年的操作记录
	 * 获取高考年，比如2018年8月31日为2018年，超过该日期后为2019年
	 * @return 2019
	 */
	public static int getCollegeYear() {
		Date now = new Date();
		int year = Integer.parseInt(getYear(now));
		int monthDay = Integer.parseInt(getOther(now,"MMdd"));
		if (monthDay>831) {
			year = year+1;
		}
		return year;
	}
	/**
	 * =============================================================
	 * 获得当前日期的年份 yyyy-MM-dd HH:mm:ss
	 *
	 * @return String
	 * =============================================================
	 */
	public static String getNowDateStr(){
		SimpleDateFormat sdf = new SimpleDateFormat(YMDHMS);
		return sdf.format(new Date());
	}

	/**
	 * =============================================================
	 * 获得当前日期
	 *
	 * @return date - java.util.Date
	 * =============================================================
	 */
	public Date getNowDate(){
		return new Date();
	}

	/**
	 * =============================================================
	 * 获得日期的年份
	 *
	 * @param date - java.util.Date
	 * @return YYYY
	 * =============================================================
	 */
	public static String getYear(Date date) {
		if (date == null)
			return "";
		SimpleDateFormat sdf = new SimpleDateFormat(Y);
		return sdf.format(date);
	}

	/**
	 * =============================================================
	 * 获得日期的月份
	 *
	 * @param date - java.util.Date
	 * @return M
	 * =============================================================
	 */
	public static String getMonth(Date date) {
		if (date == null)
			return "";
		SimpleDateFormat sdf = new SimpleDateFormat(M);
		return sdf.format(date);
	}

	/**
	 * =============================================================
	 * 获得日期的 日
	 *
	 * @param date - java.util.Date
	 * @return d
	 * =============================================================
	 */
	public static String getDay(Date date) {
		if (date == null)
			return "";
		SimpleDateFormat sdf = new SimpleDateFormat("d");
		return sdf.format(date);
	}

	/**
	 * =============================================================
	 * 获得日期的 YYYY-MM
	 *
	 * @param date - java.util.Date
	 * @return String
	 * =============================================================
	 */
	public static String getYearMonth(Date date) {
		if (date == null)
			return "";
		SimpleDateFormat sdf = new SimpleDateFormat(YM);
		return sdf.format(date);
	}

	/**
	 * =============================================================
	 * 获得日期的 YYYY-MM-DD
	 *
	 * @param date - java.util.Date
	 * @return String
	 * =============================================================
	 */
	public static String getYearMonthDay(Date date) {
		if (date == null)
			return "";
		SimpleDateFormat sdf = new SimpleDateFormat(YMD);
		return sdf.format(date);
	}

	/**
	 * =============================================================
	 * 获得日期的 YYYY-MM-DD HH:MM:SS
	 *
	 * @param date - java.util.Date
	 * @return  String
	 * =============================================================
	 */
	public static String getYearMonthDayHMS(Date date) {
		if (date == null)
			return "";
		SimpleDateFormat sdf = new SimpleDateFormat(YMDHMS);
		return sdf.format(date);
	}

	/**
	 * =============================================================
	 * 获得日期  通用匹配 eg. yyyy/MM/dd
	 *
	 * @param date - java.util.Date
	 * @return  String
	 * =============================================================
	 */
	public static String getOther(Date date,String pattern) {
		if (date == null) {
			return "";
		}
		SimpleDateFormat sdf = new SimpleDateFormat(pattern);
		return sdf.format(date);
	}

	/**
	 * =============================================================
	 * 把字符串为日期类型
	 *
	 * @param strDate (yyyy-MM-dd HH:MM:SS)
	 * @return date - java.util.Date
	 * @throws ParseException
	 * =============================================================
	 */
	public static Date parseDateYMDHMS(String strDate) throws ParseException {
		SimpleDateFormat sdf = new SimpleDateFormat(YMDHMS);
		return sdf.parse(strDate);
	}

	/**
	 * =============================================================
	 *
	 * 把字符串转换为日期
	 *
	 * @param strDate
	 * @param pattern 日期格式 eg.(yyyy/MM/dd)
	 * @return date - java.util.Date
	 * @throws ParseException
	 * =============================================================
	 */
	public static Date parseOtherDate(String strDate, String pattern) throws ParseException {
		SimpleDateFormat sdf = new SimpleDateFormat(pattern);
		return sdf.parse(strDate);
	}


	/**
	 * =============================================================
	 *
	 * 返回两个日期间的差异天数 -- yyyy-MM-dd
	 *
	 * 正数表示参照日期在比较日期之后，0表示两个日期同天，负数表示参照日期在比较日期之前
	 *
	 * @param smdate  java.util.Date
	 *            参照日期
	 * @param bgdate  java.util.Date
	 *            比较日期
	 * @return int
	 * =============================================================
	 */
	public static int daysBetween(Date smdate, Date bgdate) {
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		String str1 = "";
		String str2 = "";
		str1 = format.format(smdate);
		str2 = format.format(bgdate);
		try {
			smdate = format.parse(str1);
			bgdate = format.parse(str2);
		} catch (Exception e) {
			e.printStackTrace();
		}

		long diff = bgdate.getTime() - smdate.getTime();
		int days = (int) (diff / (1000 * 60 * 60 * 24));
		return days;
	}

	/**
	 * =============================================================
	 *
	 * 返回两个日期间的差异天数 -- yyyy-MM-dd
	 *
	 * 正数表示参照日期在比较日期之后，0表示两个日期同天，负数表示参照日期在比较日期之前
	 *
	 * @param smdate  String
	 *            参照日期
	 * @param bdate  String
	 *            比较日期
	 * @return int
	 * =============================================================
	 */
	public static int daysBetween(String smdate, String bdate) throws ParseException {

		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		Calendar cal = Calendar.getInstance();
		cal.setTime(sdf.parse(smdate));
		long time1 = cal.getTimeInMillis();
		cal.setTime(sdf.parse(bdate));
		long time2 = cal.getTimeInMillis();
		long between_days = (time2 - time1) / (1000 * 3600 * 24);
		return Integer.parseInt(String.valueOf(between_days));

	}

	/**
	 * =============================================================
	 *
	 * 返回两个日期间的差异天数 -- yyyy-MM-dd
	 *
	 * 正数表示参照日期在比较日期之后，0表示两个日期同天，负数表示参照日期在比较日期之前
	 *
	 * @param smdate  Long
	 *            参照日期
	 * @param bgdate  Long
	 *            比较日期
	 * @return int
	 * =============================================================
	 */
	public static int daysBetween(Long smdate, Long bgdate) {
        Calendar cal = Calendar.getInstance();
        cal.setTimeInMillis(smdate);
        Date beginDate = cal.getTime();//起始日
        cal.setTimeInMillis(bgdate);
        Date endDate = cal.getTime();//结束日
        long diff = endDate.getTime() - beginDate.getTime();
		int days = (int) (diff / (1000 * 60 * 60 * 24));
		return days;
	}

	/**
	 * 返回两个日期间的时分秒差异
	 * @param beginDate
	 * @param endDate
	 * @param type h、m、s
	 * @return
	 */
	public static int differBetween(Date beginDate, Date endDate, String type) {
		long diff = endDate.getTime() - beginDate.getTime();
		int divider;
		switch(type){
			case "h":
				divider=1000 * 60*60;
				break;
			case "m":
				divider=1000 * 60;
				break;
			case "s":
				divider=1000 ;
				break;
			default:
				divider = 0;
				break;
		}
		int differBetween = (int) (diff / divider);
		return differBetween;
	}

	/**
	 * =============================================================
	 *
	 * 返回两个日期间的差异天数
	 *
	 * 正数表示参照日期在比较日期之后，0表示两个日期同天，负数表示参照日期在比较日期之前
	 *
	 * @param smdate String
	 *            参照日期
	 * @param bgdate String
	 *            比较日期
	 * @param pattern String
	 * 			  日期格式     -- eg. yyyy-MM-dd HH:mm:ss
	 * @return int
	 * =============================================================
	 */

	public static int getDayDiffOnther(String smdate, String bgdate,String pattern) {
		SimpleDateFormat formatter = new SimpleDateFormat(pattern);
		ParsePosition pos = new ParsePosition(0);
		ParsePosition pos1 = new ParsePosition(0);
		Date dt1 = formatter.parse(smdate, pos);
		Date dt2 = formatter.parse(bgdate, pos1);
		long diff = dt2.getTime() - dt1.getTime();
		return (int) (diff / (1000 * 60 * 60 * 24));
	}

	/**
	 * =============================================================
	 *
	 * 返回两个日期间的差异天数
	 *
	 * 正数表示参照日期在比较日期之后，0表示两个日期同天，负数表示参照日期在比较日期之前
	 *
	 * @param smdate java.util.Date
	 *            参照日期
	 * @param bgdate java.util.Date
	 *            比较日期
	 * @param pattern String
	 * 			  日期格式    -- eg. yyyy-MM-dd HH:mm:ss
	 * @return int
	 * =============================================================
	 */

	public static int getDayDiffOnther(Date smdate, Date bgdate,String pattern) {
		SimpleDateFormat format = new SimpleDateFormat(pattern);
		String str1 = "";
		String str2 = "";
		str1 = format.format(smdate);
		str2 = format.format(bgdate);
		try {
			smdate = format.parse(str1);
			bgdate = format.parse(str2);
		} catch (Exception e) {
			e.printStackTrace();
		}

		long diff = bgdate.getTime() - smdate.getTime();
		int days = (int) (diff / (1000 * 60 * 60 * 24));
		return days;
	}

	/**
	 * =============================================================
	 *
	 * 把字符串转换为日期
	 *
	 * @param sdate
	 * @return date - Timestamp
	 * @throws ParseException
	 * =============================================================
	 */
	public static Timestamp parseTimestamp(String sdate){
		try {
			DateFormat ft = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			Timestamp ts = new Timestamp(ft.parse(sdate).getTime());
			return ts;
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return null;
	}

	public static Date longToDate(long lDate) {
		Date date = new Date(lDate * 1000);
		return date;
	}

	/**
	 * 获取转让下架时间
	 * @param date
	 * @param days
	 * @param hours
	 * @param minute
	 * @param second
	 * @return
	 */
	 public static Date getUnderCarriageDate(Date date,int days,int hours,int minute, int second){
		 Date rdate = null;
		 try{
			   Calendar  calendar = Calendar.getInstance();
			   calendar.setTime(date);
			   calendar.add(Calendar.DAY_OF_MONTH, days);//增加days天
			   //设置当前时间
			   calendar.set(Calendar.HOUR_OF_DAY, hours);
			   calendar.set(Calendar.MINUTE, minute);
			   calendar.set(Calendar.SECOND, second);
			   rdate = calendar.getTime();
		 }catch(Exception ex){

		 }
		 return rdate;
	 }

	 /**
	   * 获取加减日期
	   * @param date
	   * @param days
	   * @return
	 */
	public static String getSubtractDate(Date date,int days){
		SimpleDateFormat sdf = new SimpleDateFormat(YMD);
		Date rdate = null;
		try{
			Calendar calendar = Calendar.getInstance();
			calendar.setTime(date);
			calendar.add(Calendar.DAY_OF_MONTH, days);//增加days天
			rdate = calendar.getTime();
		}catch(Exception ex){
		}
		return sdf.format(rdate);
	}

	/**
	 * =============================================================
	 * 获得日期的 YYYY-MM-DD
	 *
	 * @param strdate - java.util.String
	 * @return String
	 * =============================================================
	 * @throws ParseException
	 */
	public static String getYMD(Object strdate) throws ParseException {
		if (strdate == null || strdate.equals("")) return "";
		SimpleDateFormat sdf = new SimpleDateFormat(YMD);
		return sdf.format(sdf.parse(strdate.toString()));
	}

    public static String getCurrentDateTimeStr(){
        SimpleDateFormat dataFormat = new SimpleDateFormat(yyyyMMddHHmmss);
        Date date = new Date();
        String timeString = dataFormat.format(date);
        return timeString;
    }

    public static String getDateTimeStr(Date date){
        SimpleDateFormat dataFormat = new SimpleDateFormat(yyyyMMddHHmmss);
        String timeString = dataFormat.format(date);
        return timeString;
    }

	/**
	 * =============================================================
	 *
	 * 是否处于两个日期之间 -- yyyy-MM-dd
	 *
	 * 正数表示参照日期在比较日期之后，0表示两个日期同天，负数表示参照日期在比较日期之前
	 *
	 * @param   today
	 *            参照日期
	 * @param   bdate
	 *            比较日期
	 * @return int
	 * =============================================================
	 */
	public static boolean IsTodayBetween(String today, String bdate, String edate) {
		try {
			int days = daysBetween(today, bdate); //比开始时间
			int dayb = daysBetween(today, edate); //
			if(days>0 && dayb>0){
				return true;
			}
		} catch (ParseException e) {
			return false;
		}
		return true;
	}

	public static Date getAddSecond(Date date, int second){
		Date rdate = null;
		try{
			Calendar  calendar = Calendar.getInstance();
			calendar.add(Calendar.MINUTE,second);
			rdate = calendar.getTime();
		}catch(Exception ex){

		}
		return rdate;
	}

	/**
	 * 月份开始
	 * @return 返回如2019-03-01 00:00:00
	 */
	public static Date getMonthStart(Calendar calendar) {
		Calendar cal = (Calendar) calendar.clone();
		cal.set(Calendar.DAY_OF_MONTH,1);
		cal.set(Calendar.HOUR_OF_DAY,0);
		cal.set(Calendar.MINUTE,0);
		cal.set(Calendar.SECOND,0);
		cal.set(Calendar.MILLISECOND,0);
		return cal.getTime();
	}

	/**
	 * 月份结束
	 * @return 返回如2019-03-31 23:59:59
	 */
	public static Date getMonthEnd(Calendar calendar) {
		Calendar cal = (Calendar) calendar.clone();
		cal.add(Calendar.MONTH,1);
		cal.set(Calendar.DAY_OF_MONTH,1);
		cal.add(Calendar.DAY_OF_MONTH,-1);
		cal.set(Calendar.HOUR_OF_DAY,23);
		cal.set(Calendar.MINUTE,59);
		cal.set(Calendar.SECOND,59);
		cal.set(Calendar.MILLISECOND,999);
		return cal.getTime();
	}

	/**
	 * 比较时间大小
	 * @param strDate
	 * @return
	 */
	public static int comparetoTime(String strDate){
		SimpleDateFormat sdf=new SimpleDateFormat("yyyyMdd");
		ParsePosition pos = new ParsePosition(0);
		Date dt1 = sdf.parse(strDate,pos);
		Date dt2 = new Date();
		//比较时间大小,如果dt1大于dt2
		if(dt1.getTime()>dt2.getTime()){
			return 1;
		}else{
			return 0;
		}
	}

	/**
	 * 时间转化
	 * @param strDate
	 * @return
	 */
	public static String getDate(String strDate){
		SimpleDateFormat sdf=new SimpleDateFormat("yyyyMdd");
		SimpleDateFormat sd=new SimpleDateFormat(YMD);
		ParsePosition pos = new ParsePosition(0);
		Date date = sdf.parse(strDate,pos);
		return sd.format(date);
	}

	/**
	 * 比较时间大小
	 * @param date1
	 * @param date2
	 * @return
	 */
	public static int comparetoTime(String date1,String date2){
		SimpleDateFormat sdf=new SimpleDateFormat(YMD);
		ParsePosition pos = new ParsePosition(0);
		ParsePosition pos1 = new ParsePosition(0);
		Date dt1 = sdf.parse(date1,pos);
		Date dt2 = sdf.parse(date2,pos1);
		//比较时间大小,如果dt1大于dt2
		if(dt1.getTime()>=dt2.getTime()){
			return 1;
		}else{
			return 0;
		}
	}


	public static void main(String[] args) throws Exception {
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.MONTH,3);
		System.out.println(getMonthStart(cal));
		System.out.println(getMonthEnd(cal));
		System.out.println(cal.getTime());
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		Date parse = sdf.parse("2019-02-03");
		System.out.println(getDay(parse));
	}

}
